package com.yidu.ladder.util;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.multipart.MultipartFile;
/**
 * excel读写工具类
 * Excel 导入到mysql
 * @author Lw
 * @since 2019/11/20
 */
public class POIUtil {

        private static Logger logger  = Logger.getLogger(POIUtil.class);
        private final static String xls = "xls";
        private final static String xlsx = "xlsx";

        /**
                         * 读入excel文件，解析后返回
         * @param file
         * @throws IOException
         */
        public static List<String[]> readExcel(MultipartFile file) throws IOException{
            //检查文件
            checkFile(file);
            //获得Workbook工作薄对象
            Workbook workbook = getWorkBook(file);
            //创建返回对象，把每行中的值作为一个数组，所有行作为一个集合返回
            List<String[]> list = new ArrayList<String[]>();
            if(workbook != null){
                for(int sheetNum = 0;sheetNum < workbook.getNumberOfSheets();sheetNum++){
                    //获得当前sheet工作表
                    Sheet sheet = workbook.getSheetAt(sheetNum);
                    if(sheet == null){
                        continue;
                    }
                    //获得当前sheet的开始行
                    int firstRowNum  = sheet.getFirstRowNum();
                    //获得当前sheet的结束行
                    int lastRowNum = sheet.getLastRowNum();
                    //循环除了第一行的所有行
                    for(int rowNum = firstRowNum+1;rowNum <= lastRowNum;rowNum++){
                        //获得当前行
                        Row row = sheet.getRow(rowNum);
                        if(row == null){
                            continue;
                        }
                        //获得当前行的开始列
                        int firstCellNum = row.getFirstCellNum();
                        //获得当前行的列数
                        int lastCellNum = row.getPhysicalNumberOfCells();
                        String[] cells = new String[row.getPhysicalNumberOfCells()];
                        //循环当前行
                        for(int cellNum = firstCellNum; cellNum < lastCellNum;cellNum++){
                            Cell cell = row.getCell(cellNum);
                            cells[cellNum] = getCellValue(cell);
                        }
                        list.add(cells);
                    }
                }
               // workbook.close();
            }
            return list;
        }
        public static void checkFile(MultipartFile file) throws IOException{
            //判断文件是否存在
            if(null == file){
                logger.error("文件不存在！");
                throw new FileNotFoundException("文件不存在！");
            }
            //获得文件名
            String fileName = file.getOriginalFilename();
            //判断文件是否是excel文件
            if(!fileName.endsWith(xls) && !fileName.endsWith(xlsx)){
                logger.error(fileName + "不是excel文件");
                throw new IOException(fileName + "不是excel文件");
            }
        }
        
        public static Workbook getWorkBook(MultipartFile file) {
            //获得文件名
            String fileName = file.getOriginalFilename();
            //创建Workbook工作薄对象，表示整个excel
            Workbook workbook = null;
            try {
                //获取excel文件的io流
                InputStream is = file.getInputStream();
                //根据文件后缀名不同(xls和xlsx)获得不同的Workbook实现类对象
                if(fileName.endsWith(xls)){
                    //2003
                    workbook = new HSSFWorkbook(is);
                }else if(fileName.endsWith(xlsx)){
                    //2007 及2007以上
                    workbook = new XSSFWorkbook(is);
                }
            } catch (IOException e) {
                logger.info(e.getMessage());
            }
            return workbook;
        }
        
        public static String getCellValue(Cell cell){
            String cellValue = "";
            if(cell == null){
                return cellValue;
            }
            switch (cell.getCellType()) {  
            //数值型  
            case Cell.CELL_TYPE_NUMERIC:  
                if (HSSFDateUtil.isCellDateFormatted(cell)) {  
                    //如果是date类型则 ，获取该cell的date值  
                    Date date = HSSFDateUtil.getJavaDate(cell.getNumericCellValue());  
                    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");  
                    cellValue = format.format(date);;  
                }else {// 纯数字  
                    BigDecimal big=new BigDecimal(cell.getNumericCellValue());  
                    cellValue = big.toString();  
                    //解决1234.0  去掉后面的.0  
                    if(null!=cellValue&&!"".equals(cellValue.trim())){  
                         String[] item = cellValue.split("[.]");  
                         if(1<item.length&&"0".equals(item[1])){  
                        	 cellValue=item[0];  
                         }  
                    }  
                }  
                break;  
                //字符串类型   
            case Cell.CELL_TYPE_STRING:  
            	cellValue = cell.getStringCellValue().toString();  
                break;  
            // 公式类型  
            case Cell.CELL_TYPE_FORMULA:  
                //读公式计算值  
            	cellValue = String.valueOf(cell.getNumericCellValue());  
                if (cellValue.equals("NaN")) {// 如果获取的数据值为非法值,则转换为获取字符串  
                	cellValue = cell.getStringCellValue().toString();  
                }  
                break;  
            // 布尔类型  
            case Cell.CELL_TYPE_BOOLEAN:  
            	cellValue = " "+ cell.getBooleanCellValue();  
                break;   
            default:  
            	cellValue = cell.getStringCellValue().toString();  
        } 
   
            return cellValue;
        }
    }